그래프를 그리기 위해서 matplotlib을 임포트 합니다. %matplotlib inline은 새로운 창을 띄우지 않고 주피터 노트북 안에 이미지를 삽입하여 줍니다.


In [ ]:
import matplotlib.pyplot as plt
%matplotlib inline

텐서플로우에는 이진분류를 위한 데이터셋이 없어 사이킷런의 데이터셋을 이용합니다. 그리고 입력 데이터를 저장할 넘파이 배열을위해 넘파이 패키지를 임포트합니다. 마지막으로 텐서플로우를 임포트합니다.

from sklearn import datasets import numpy as np ....


In [ ]:

sklearn.datasets 밑에 있는 load_breast_cancer() 함수를 사용해 위스콘신 유방암 데이터를 로드합니다.

cancer = datasets.load_breast_cancer()


In [ ]:

cancer.feature_names의 길이를 확인해 보세요. 특성이 총 몇개인가요.


In [ ]:

cancer.feature_names를 출력해 보세요. 특성이 어떤 종류의 데이터인지 가늠해 볼 수 있습니다.


In [ ]:
cancer.feature_names

이 데이터셋은 악성이 1, 양성이 0인 이진 분류의 문제입니다. 따라서 타겟 값은 1 또는 0 으로 되어 있습니다. cancer.target에서 100~110 번째 데이터를 한번 확인해 보세요. 다른 위치의 데이터를 확인해도 됩니다.

cancer.target[100:110]


In [ ]:

cancer.data가 샘플 데이터 x 이고, cancer.target이 정답 y 입니다. 이 두 데이터는 모두 넘파이 배열로 되어 있습니다. 넘파이 배열에는 shape 속성이 있어서 배열의 차원을 알 수 있습니다. 두 변수의 차원을 확인해 보세요.

cancer.data.shape, ...


In [ ]:

cancer.datacancer.target은 넘파이 배열로 float64 값을 가집니다. 텐서플로우에서는 특별한 경우를 제외하고 성능을 위해서 float32를 기본으로 합니다. 그래서 이 두 넘파이 배열을 float32로 바꾸도록 하겠습니다.

그리고 cancer.target은 1차원 배열이므로 2차원 구조로 변경하여 569개의 행을 가지고 1나의 행을 가지도록 변경하겠습니다.

x = cancer.data.astype('...') y = cancer.target.astype('...').reshape(..., 1)


In [ ]:
x = ...
y = ...

이제 x 와 y 의 차원을 다시 확인해 보세요.


In [ ]:

데이터 x 와 곱해질 가중치 W 변수를 만듭니다. 이 변수는 특성의 개수만큼 크기를 가집니다. x 의 한 행마다 곱해져야 하므로 W는 열벡터로 만들어야 합니다.

W = tf.Variable(tf.zeros([.., ..]))

편향 값 b 는 한개만 있어도 됩니다.

b = tf.Variable(tf.zeros([.]))

이제 x 와 W 를 곱하면 됩니다. 선형 회귀 때와는 달리 행렬곱을 위해 tf.matmul() 함수를 사용합니다.

y_hat = tf.matmul(x, W) + b


In [ ]:
W = ...
b = ...
y_hat = ...

시그모이드 크로스 엔트로피 손실 함수는 tf.losses.sigmoid_cross_entropy()에 정의되어 있습니다. 경사하강법 최적화 셋팅은 선형회귀 때와 동일합니다. 학습 속도를 0.00001 로 해보세요. 그리고 나중에 학습 속도를 바꾸어서 다시 테스트해 보세요.


In [ ]:
loss = tf.losses.sigmoid_cross_entropy(.., ..)
optimizer = ...
train = ...

세션 객체를 생성하고 변수를 초기화 합니다.


In [ ]:
init = ...
sess = ...
sess.run(init)

sess.run()으로 학습 노드 train과 손실 loss를 실행하세요.


In [ ]:
costs = []
for step in range(5000):
    _, c = sess.run([.., ..])
    costs.append(c)

예측 결과를 보려면 선형 계산인 y_hat에 시그모이드 함수를 적용해야 합니다. 텐서플로우에는 tf.sigmoid() 함수가 있습니다. 리턴된 결과는 569개의 샘플에 대한 예측 결과를 담고 있는 넘파이 배열입니다.

prediction = sess.run(tf.sigmoid(y_hat))

이 배열에서 0.5 이상인 값들은 악성(1)으로 구분하고 나머지는 양성(0)으로 만듭니다. 그리고 원본 타깃값 y 와 비교하겠습니다.

accuracy = (prediction > 0.5) == y


In [ ]:
prediction = ...
accuracy = ...

np.sum() 함수는 배열의 값을 모두 더합니다. True/False 로 되어 있는 배열에 적용하면 True인 갯수를 헤아리는 효과가 됩니다. 그런 다음 전체 샘플 개수로 나누면 정확히 예측한 비율을 얻을 수 있습니다.

np.sum(accuracy)/len(y)


In [ ]:
np.sum(...)/len(.)

손실 함수에서 리턴된 값이 들어가 있는 costs 리스트로 그래프를 그려 보세요.


In [ ]:
plt.plot(...)